<?php
// Ce script vérifie que l'utilisateur n'a pas essayé de soumettre trop de formulaire en une minute
// on peut ainsi éviter des attaques par force brute pour trouver un mot de passe

// principe : on mémorise le nombre de formulaires envoyés par minutes dans une variable de session
//			 si ce nombre dépasse un seuil prédéfini, on bloque l'utilisateur
//			et un cookie est créé pour indiquer que l'utilisateur a dépassé le seuil

	$_SESSION['duree_blocage']=60;	// le nombre de secondes pendant lesquelles l'utilisateur doit attendre
						// s'il a envoyé trop de formlulaires
	$nombre_max_soumissions = 15;	// le nombre d'envois de formulaire par minute maximum autorisé avant blocage

// remet le nombre de soumissions de formulaires à zéro après une minute
	if(isset($_SESSION['nombre']) AND $_SESSION['timestamp_limite'] < time())
	{
		unset($_SESSION['nombre']);
		unset($_SESSION['timestamp_limite']);
	}
	
	
//---------------- partie comptabilisant le nombre de soumissions de formulaires -------------	

	// si l'utilisateur se déconnecte, on ne saura plus combien de fois il avait soumis de formulaire.
	// on sauvegarde donc cette information dans un cookie
	// on utilise un autre cookie pour savoir si cette information est encore d'actualité
	if(isset($_POST['deconnexion'], $_SESSION['nombre'])  )	
	{
		$timestamp_marque = time() + $_SESSION['duree_blocage']; // la date de fin de validité du blocage 
		$cookie_vie = time() + 3600*24; // Durée de vie de 24 heures pour le décalage horaire
		setcookie("nombre_soumissions", $_SESSION['nombre'], $cookie_vie);
		setcookie("temps_expiration", $timestamp_marque, $cookie_vie);
	}
		
		// si l'utilisateur s'est déconnecté après avoir envoyé des formulaires
		// et qu'il se reconnecte, on récupère ce nombre dans le cookie qui y est destiné
	else if( isset($_COOKIE['temps_expiration'], $_COOKIE['nombre_soumissions'] )
	AND !isset($_SESSION['nombre']) )
	{
		// après un certain temps, on supprime les cookies pour remettre le nombre à 0
		if($_COOKIE['temps_expiration'] < time())
		{
			setcookie("nombre_soumissions", "", 0);
			setcookie("temps_expiration", "", 0);
		}
		//sinon, on lit la valeur enregistrée dans le cookie
		else 
		{
			if($_COOKIE['nombre_soumissions'] >0 )	// le cookie a pu être modifié
			{
					$_SESSION['nombre'] = $_COOKIE['nombre_soumissions'];
					$_SESSION['timestamp_limite'] = time() +$_SESSION['duree_blocage'];
			}
			setcookie("nombre_soumissions", "", 0);	// on supprime les cookies
			setcookie("temps_expiration", "", 0);
		}
	}
	
// ------------- partie concernant le blocage -----------------
	
	// lorsqu'on bloque un utilisateur, un cookie "marqueur" est créé sur sa machine
	if(!isset($_COOKIE['marqueur']))	// si un tel cookie n'existe pas (donc qu'il n'a pas été bloqué)
	{	
		if(count($_POST) >0 ) // Si un formulaire a été rempli
		{
			// Si la variable de session qui compte le nombre de soumissions n'existe pas
			if(!isset($_SESSION['nombre']))
			{				
				$_SESSION['nombre'] = 0; // Initialisation des variables de nombre et de blocage 
				$_SESSION['timestamp_limite'] = time() +$_SESSION['duree_blocage'];
			}
			$_SESSION['nombre']++;
			
			if($_SESSION['nombre'] > $nombre_max_soumissions)	// en cas de dépassement du quota
			{
				// on met à jour le temps de blocage pour qu'il commence au moment du dépassement
				if($_SESSION['nombre']==$nombre_max_soumissions+1)
					$_SESSION['timestamp_limite'] = time() +$_SESSION['duree_blocage'];
				// Si le cookie marqueur n'existe pas on le crée 
				if(!isset($_COOKIE['marqueur']))
				{
					$timestamp_marque = time() + $_SESSION['duree_blocage']; 
					$cookie_vie = time() + 60*60*24; // Durée de vie de 24 heures pour le décalage horaire
					setcookie("marqueur", $timestamp_marque, $cookie_vie);
				}
		
				// on quitte le script
				affiche_erreur();
			}
			
		}
		
	}		// si on avait placé un cookie pour indiquer que l'utilisateur a envoyé trop de formulaires
	else if($_COOKIE['marqueur'] > time())	// et que le cookie est toujours actif
		affiche_erreur();
		
	else // Si le temps de blocage du cookie a été dépassé
		setcookie("marqueur", "", 0);	// Destruction du cookie

	function affiche_erreur()
	{
	
		include_once '../Generique/header.php';
		include_once '../Generique/header_body.php';
		include_once '../Generique/debut_cadre.php';

echo '
			<h1 style="text-align: center">  TROP DE FORMULAIRES ONT &Eacute;T&Eacute; SOUMIS <br /><br /><br />
			';
			if($_SESSION['duree_blocage']>=120)
				echo 'VEUILLEZ ATTENDRE '.$_SESSION['duree_blocage']/60 .' MINUTES 	</h1>';
			else
				echo 'VEUILLEZ ATTENDRE '.$_SESSION['duree_blocage']/60 .' MINUTE 	</h1>
				
	</div>
	</div>
	';
	include_once "../Generique/fin_pied.php";

	//	<p>	temps actuel : '.time().' temps limite : '.$_SESSION['timestamp_limite'].'</p>
		exit();
	}

	
?>